﻿//参数1：队列数组，参数2：执行队列每个元素会调用的回调函数，参数3：获取状态，通过设置这个回调函数，可知道执行状态
function Queue(_QueueObj,_CallBack,_statusCallBack){
this.QueueObj=_QueueObj;  //队列对象  
this.CallBack=_CallBack;  //回调函数
this.statusCallBack=_statusCallBack;//用于获取状态的回调函数，处理各种状态.状态值如下
this.T=0;                  //定时器句柄
this.CurrentObj=new Array();   //正在访问的队列中的元素，结构：{0.队列对象,1.状态}
this.Currentstatus=new Array(0,1,2,3);  //执行状态：0.开始执行，1.执行中,2.执行下一个，3.执行完毕

//入口函数，开启
this.run=function(){
if (this.QueueObj instanceof Array){
this.statusCallBack(this.Currentstatus[0]);
this.CurrentObj[0]= this.QueueObj.pop();
this.CurrentObj[1]=0;
//执行回调，请求回来改变当前队列元素的状态变为1，便会执行下一个队列元素
this.CallBack(this.CurrentObj[0]);


this.T=setInterval(this._autorun(this),2000);

}else{
	return false;
}



}
//清楚队列
this.clear=function(){
    this.CurrentObj[0]=null;
    this.CurrentObj[1]=0;
    clearTimeout(this.T);
}
//标记当前队列元素执行完毕
this.next=function(){
this.CurrentObj[1]=1;
}

this._autorun=function(obj){
	return function(){
	    if(obj.CurrentObj[1]==1){
		//可以执行队列的下一个元素
		if(obj.QueueObj.length>0){
			//队列还没执行完毕，执行下一个队列元素
			obj.CurrentObj[0]=obj.QueueObj.pop();
			obj.CallBack(obj.CurrentObj[0]);
			obj.statusCallBack(obj.Currentstatus[2]);
		}else{
			//队列元素都执行完毕了
			obj.statusCallBack(obj.Currentstatus[3]);
			clearInterval(obj.T);

		}
		obj.CurrentObj[1]=0;

	}else{
		//执行中
		obj.statusCallBack(obj.Currentstatus[1]);
	}


	}
	
}


}